﻿<h1>Go官方工具链</h1>

<p>
目前，Go官方工具链中提供的工具是使用的最广泛的Go开发工具。
《Go语言101》所有中所有的实例代码都使用标准编译器编译验证过。
</p>

<p>
本文将介绍如何配置Go开发环境和如何使用Go官方工具链中的<code>go</code>命令运行简单的Go程序。
各种<code>go</code>子命令也将获得简单的介绍。
</p>

<h3>安装Go官方工具链</h3>

<p>
请从<a href="https://golang.org/doc/install">国际官网</a>或者<a href="https://golang.google.cn/doc/install">国内官网</a>下载Go官方工具链，
并按照下载页面中的说明安装Go官方工具链。
</p>

<p>
Go官方工具链的版本和其所支持的最高Go语言版本是一致的。
比如，Go官方工具链1.15.x支持从1.0到1.15的所有Go语言版本。
</p>

<p>
为了从任意目录运行Go官方工具链中工具命令（主要各种<code>go</code>子命令），
Go官方工具链安装目录下的<code>bin</code>子目录路径必须配置在<code>PATH</code>环境变量中。
</p>

<p>
一些老的Go官方工具链版本可能需要配置<code>GOROOT</code>和<code>GOPATH</code>环境变量。
当前最新的Go官方工具链版本对这些没有做强制要求。
<code>GOPATH</code>环境变量的默认值为当前用户的HOME目录下的名为<code>go</code>文件夹对应的目录。
<code>GOPATH</code>环境变量中可以指定多个目录。
</p>

<p>
<code>GOBIN</code>环境变量用来指定某些<code>go</code>子命令（比如<code>go install</code>，见下）产生的二进制可执行文件应该存储在何处。
如果此环境变量未指定，<code>go</code>命令将使用<code>GOPATH</code>环境变量中指定的第一个路径下的<code>bin</code>子目录路径来存储这些可执行文件。
此目录的路径需配置在<code>PATH</code>环境变量中，以便从任意目录运行这些可执行文件。
</p>

<p>
在Go官方工具链1.11版本之前，<code>go</code>命令推荐所有的Go代码都放在<code>GOPATH</code>环境变量中指定的任一个路径下的<code>src</code>子目录中，尤其是依赖于其它第三方代码库包的Go项目代码。
代码库包将在后面的<a href="packages-and-imports.html">代码包和包引入</a>一文中详述。
</p>

<p>
Go官方工具链1.11引入了一个试验性的特性：Go模块（Go modules）。
此特性让我们得以自由地将我们的Go项目代码放置在任何目录下。
我们可以从<a href="https://github.com/golang/go/wiki/Modules">此官方维基页面</a>得到更多关于Go模块的信息。
</p>

<p>
注意，从Go官方工具链1.13开始，Go模块模式已成为Go项目开发中的推荐模式。
旧的<code>GOPATH</code>模式将不再推荐。<code>GOPATH</code>环境变量的意义和必要性将大大减弱，甚至逐渐消失。
另一方面，<code>GOBIN</code>环境变量的重要性将提升，因为我们仍需要一个目录路径用来存储某些<code>go</code>子命令产生的二进制可执行文件。
</p>

<!--
<p><i>
在Go官方工具链1.9之前，<code>GOROOT</code>环境变量必须被配置为Go官方工具链的安装目录。
自从Go官方工具链1.9，此环境变量变为可选的，并且不推荐配置之。
</i></p>

<p>
在Go官方工具链1.8之前，<code>GOPATH</code>环境变量必须被配置。
自从Go官方工具链1.8，此环境变量变为可选的。它的默认值为当前用户目录下的<code>go</code>子目录路径。
此环境变量可以包含多个路径。
</p>
-->

<h3>最简单的Go程序</h3>

<div>
<p>
让我们写一个简单的Go程序，并且学习如何运行之。
</p>

下面的程序应该是最简单的Go程序。
<pre class="line-numbers must-line-numbers fixed-width"><code class="language-go">package main

func main() {
}
</code></pre>

<p>
在此程序中，单词<code>package</code>和<code>func</code>是两个关键字。
两个<code>main</code>是两个标识符。
标识符和关键字将在后续的一篇文章中讲解。
</p>

<p>
此程序的第一行指定了当前源代码文件所处的包的包名（此处为<code>main</code>）。
第二行是一个空行，用来增强可读性。
第三和第四行声明了一个名为<code>main</code>的函数。
此函数为程序的入口函数。
</p>

</div>

<h3>运行一个Go程序</h3>

<div>

<p>
Go官方工具链工具要求所有的Go源代码文件必须以<code>.go</code>后缀结尾。
这里，我们假设上面展示的最简单的Go程序存放在一个名叫<code>simplest-go-program.go</code>的文件中。
</p>

打开一个终端（控制台）并进入上述源文件所在的目录，然后运行

<pre class="output"><code>$ go run simplest-go-program.go
</code></pre>

<p>
什么也没输出？是的，此程序不做什么有实质意义的事儿。
</p>

<p>
如果代码中有语法错误，这些错误将输出在终端中。
</p>

如果一个程序的<code>main</code>包中有若干Go源代码文件，我们也可以使用下面的命令运行此程序。

<pre class="output"><code>$ go run .
</code></pre>

<p>
注意：<code>go run</code>子命令并不推荐在正式的大项目中使用。<code>go run</code>子命令只是一种方便的方式来运行简单的Go程序。
对于正式的项目，最好使用<code>go build</code>或者<code>go install</code>子命令来编译生成可执行程序文件。
</p>

</div>

<h3>更多<code>go</code>子命令</h3>

<p>
上面提到的三个<code>go</code>子命令（<code>go run</code>、<code>go build</code>和<code>go install</code>）
将只会输出代码语法错误。它们不会输出可能的代码逻辑错误（即警告）。
<code>go vet</code>子命令可以用来检查可能的代码逻辑错误。
</p>

<p>
我们可以使用<code>go fmt</code>子命令来用同一种代码风格格式化Go代码。
</p>

<p>
我们可以使用<code>go get</code>子命令将一个远程Go代码库拉取到本地以便将其做为第三方Go包引入并使用其中的资源。
<code>go get</code>子命令需要首先安装相应的代码版本管理工具。
</p>

<p>
我们可以使用<code>go test</code>子命令来运行单元和基准测试用例。
</p>

<p>
我们可以使用<code>go doc</code>子命令来查看Go代码库包的文档。
</p>

<p>
从Go官方工具链1.11版本开始，我们可以运行<code>go mod</code>子命令来管理包依赖。
</p>

<p>
我们可以运行<code>go help aSubCommand</code>来查看一个子命令<code>aSubCommand</code>的帮助信息。
</p>

<p>
运行不带参数的<code>go</code>命令将会列出所有支持的<code>go</code>子命令。
</p>

<p>
《Go语言101》系列文章将不再对各种<code>go</code>子命令做更多的解释。
请阅读<a href="https://golang.google.cn/cmd/go/">官方文档</a>
（<a href="https://golang.org/cmd/go/">墙外版</a>）以获取更多信息。
</p>

<a class="anchor" id="doc"></a>
<h3>查看Go文档</h3>

<div>

<p>
我们可以在Go官网<a href="https://golang.org">golang.org</a>（<a href="https://golang.google.cn">墙内版</a>）阅读Go官方文档。
</p>

<p>
我们也可以使用命令<code>go get -u golang.org/x/tools/cmd/godoc</code>来安装<b>godoc</b>程序，然后运行<code>godoc -http=:9999</code>来开启官网的一个本地镜像（<a href="http://localhost:9999">localhost:9999</a>）来阅读Go官方文档。此<b>godoc</b>工具也可用来查看本地Go项目代码的文档。
</p>

<p>
另一款用来查看本地Go项目代码文档的工具是<b>Gold</b>（由本书作者老貘开发）。
此工具将列出类型的实现关系，并且支持良好的代码阅读体验。
我们可以使用命令<code>go get -u go101.org/gold</code>来安装<b>Gold</b>（目前，在安装之前需要临时将<code>GO111MODULE</code>环境变量设为<code>on</code>）。
我们也可以将<a href="https://github.com/go101/gold"><b>Gold</b>项目的代码</a>克隆下来，然后运行<code>go install</code>来安装<b>Gold</b>。
安装完成之后，我们可以运行<code>gold std</code>来阅读标准库的文档。
</p>

</div>

